计算机系统由不同的抽象层构成,计算机解决应用问题的过程就是不同的抽象层转换的过程(见图1)。计算机解决一个应用问题,首先需要将其转换为算法流程;然后将算法流程转换为用高级程序设计语言描述的一个程序;在操作系统提供的用户界面和内核程序的支撑下,通过相应软件开发环境提供的编译器、汇编器等各种语言处理程序,将高级语言源程序转换为机器指令表示的目标程序;最后通过由电路构成的计算机硬件来执行目标程序中的一条一条指令,以实现应用。因此,这种层次结构决定了计算机系统各抽象层之间存在着非常大的关联。
图1 计算机系统抽象层
21世纪开始,计算机应用进入到后PC时代,并行成为重要主题。培养具有系统观的、能进行软/硬件协同设计的计算机系统贯通人才是关键。所谓具有系统观的人才,是指能够站在系统的高度考虑和解决应用问题,具有系统层面的分析、设计、检错和调优等能力。为此,需要提高学生对整个计算机系统的认识,包括对计算机系统层次结构的深刻理解;对高级语言程序、指令集体系结构(ISA)、操作系统(OS)、编译器和链接器等之间关系的深入掌握;对指令在硬件上执行过程的理解和认识;对构成计算机硬件的基本电路特性和设计方法等的基本了解等。
但是,以前基于PC时代背景下的计算机专业教学课程体系,按计算机系统的不同层次内容划分课程,会造成以下问题:各课程间相互割裂、互不关联;缺乏一门贯穿系统各层次内容的基础课程;教学内容陈旧,没有与时俱进,对新型计算系统的教学考虑不够;缺乏系统性的综合实践环节。这使学生在理论上一知半解, 在实践上动手能力较差,因而很难达到系统能力的培养目标。
针对上述问题, 我们考察了美国几个一流大学的做法,结合自身情况,提出了一种多层次螺旋式递进的计算机系统课程教学思路,并在南京大学计算机科学与技术系本科生教学中进行了初步实践,取得了良好的效果。
课程教学体系的框架
多层次螺旋式递进的系统能力培养课程体系由3个层次组成,如图2所示。第一层系统基础课程,主要包括程序设计及实验、数字电路及实验和计算机系统基础等3组课程,在本科一至二年级开设;第二层系统核心课程,主要包括计算机组成与设计及系统结构、操作系统和编译原理等3组课程,在本科二至三年级开设;第三层系统综合课程,包括计算机系统设计综合实验、嵌入式系统、并行处理技术和大数据处理综合实验等若干门不同的计算系统综合课程,在本科三至四年级开设。
图2 多层次螺旋式递进的系统能力培养课程体系
该课程体系的总体构建思路为“从简单到复杂、从框架到细节、从单机到综合”,体现了多层次螺旋式递进的系统能力培养模式。首先,从最基础的程序设计基础和数字电路开始认识计算机,然后通过计算机系统基础课程中讲解的C语言程序的表示、转换、链接,以及程序的正常执行和异常执行等内容,将程序和电路之间的各个抽象层串接起来,形成对计算机系统整体框架的基本认识;再通过第二层的3组课程把ISA及CPU实现、操作系统和编译等系统核心内容进行细化讲解,使学生对系统的认识上升到具体实现的高度;最后,通过第三层不同的系统综合课程的学习,来提高学生利用不同计算系统解决实际问题的能力。
课程教学体系的实施
计算机系统能力培养教学改革的效果,不仅仅取决于合理的计算机系统课程教学体系的构建,更重要的是如何围绕系统能力的培养目标,来实施每门课程的教学。
第一层系统基础课程的教学实施
程序设计基础课程主要介绍C语言程序设计技术的基础内容,让学生初步理解高级语言及其高级语言程序设计涉及到的概念,初步理解图1所示的计算机系统中最上面三个抽象层(应用、算法和编程)及其相互转换关系。学完该课程后,学生能够了解计算机解决应用问题的过程:首先,必须将其转换为算法;然后,用某种编程语言将算法编写成程序;最后,在计算机上运行程序,实现应用。学完本课程后,学生应该了解为什么计算机能够执行程序、计算机如何执行程序等问题。C语言是最接近系统底层的高级编程语言,可以用来编写操作系统等系统软件,但它又不涉及系统底层的细节内容。由于学生可以通过程序的执行结果来直接理解C语言的语法和语义,无需任何前导知识,因而它非常适合作为系统能力培养的入门课程,安排在本科一年级上学期开设。为巩固C语言基础,并为后续计算机系统基础课程中大量编程实验打下坚实基础,在一年级下学期专门开设了相应的程序设计实验课程。
数字电路课程主要围绕组合逻辑和时序逻辑两大核心内容,主要在逻辑门与功能部件这两个层次展开。后续课程中用到的功能部件(如半加器、全加器、加法器、比较器、编码器、译码器、触发器、寄存器、移位器和内存储器等),作为数字电路设计的实例进行介绍。学完该课程后,学生能够了解并初步掌握图1所示的计算机系统中最下面的三层(功能部件、门电路和器件)的相关内容。数字电路课程从最简单的布尔代数和基本的器件、门电路开始学习,无需任何前导知识,因而它也适合作为系统能力培养的入门课程,在本科一年级上学期开设。为了巩固所学的数字电路理论知识,并为后续计算机组成与设计及系统结构课程的CPU设计实验打下坚实的基础,我们在一年级下学期专门开设了数字电路实验课程。
经过第一学年专业课程的学习,学生对图1所示的计算机系统上面三层和下面三层的内容有了基本了解,而对中间几层的内容知之甚少,因而还没有形成对计算机系统的完整认识。为此,我们在二年级上学期新开设了一门贯穿整个系统的计算机系统基础课程,主要介绍高级语言程序中的数据类型及其运算、语句和过程调用等,是如何在计算机系统中实现的,从宏观上介绍计算机系统涉及到的各个层次。这样使学生从整体上了解计算机系统全貌和相关知识体系,初步理解计算机系统中每个抽象层及其相互转换关系。学完该课程后,学生能从程序员的角度认识计算机系统;能够了解高级语言程序、ISA、操作系统、编译器、链接器等之间的相互关联,对指令在硬件上的执行过程和指令的底层硬件执行机制有一定的认识和理解,从而增强学生在程序调试、性能提升、程序移植和健壮性等方面的能力,并为后续的“计算机组成与设计及系统结构”、“操作系统”和“编译原理”等核心课程的学习打下坚实基础。在该课程教学过程中,我们编写了国内第一套基于IA-32/Linux的计算机系统基础方面的教材及教辅,还自行设计了与教材内容匹配度高达95%的一整套x86模拟器实验,其实验的深度和广度为国内外同类实验中最高。该实验大大增强了学生的系统思维和大规模程序开发的能力,得到学生的高度肯定。
第二层系统核心课程的教学实施
通过第一层系统基础课程的学习,学生已经具备了第二层课程的先导知识,而第二层的几组系统核心课程之间没有前后顺序关系。
操作系统课程系统地讲解操作系统的基本概念、设计原理和实现技术。计算机系统基础课程后几章介绍了C语言程序与虚拟存储管理、异常/中断和I/O子系统等之间的关系,这些都与操作系统课程内容有着非常密切的关系。计算机系统基础课程结束以后,紧接着开设操作系统课程,可以让学生从对系统框架的基本认识上升到对系统实现细节的深刻理解。显然,操作系统课程主要涉及图1中第六层(操作系统/虚拟机)内容的强化学习。操作系统是一门实践性很强的课程,要学好操作系统,必须动手实践。我们规划的实验以设计性实验为主,配合原理教学同步进行操作系统的模拟实验,要求学生能够基于虚拟机环境,实现一个包含系统启动、内核线程调度、内核同步与通信、进程及其存储管理和文件管理等部分的可运行的操作系统内核。通过实验,学生对操作系统总体结构的理解得到强化,学生的编程实践能力得到进一步提高。
计算机组成与设计及系统结构课程包括两学期的内容。在本科三年级上学期开设了计算机组成与设计课程,主要从寄存器传送级(Register Transfer Level, RTL)以上层次介绍单处理器计算机设计的基本原理和设计细节,重点在CPU设计和存储器设计方面,目标是使学生在理解高级语言程序与机器级代码之间对应关系的基础上,进一步理解机器级代码在具体硬件系统中执行的过程以及如何构造计算机硬件系统。在三年级下学期开设的计算机体系结构课程主要进行多核处理器、众核处理器、多处理机系统和集群系统等不同粒度和规模的并行计算机系统的工作原理、实现方式及其应用方面的深化学习。因此,该课程组主要涉及指令集体系结构和微体系结构,通过实现细节介绍这两个层次与上层的操作系统/虚拟机以及与下层的功能部件/寄存器传送级之间的关系。通过该课程的学习,要求学生能够利用硬件描述语言和FPGA开发板来设计基本的功能部件以及单周期CPU和流水线CPU。因而,在课程内容组织方面应该细化通用寄存器组、算数逻辑单元(ALU)和桶形移位器等功能部件设计的内容,细化单周期CPU和流水线CPU设计的内容,并讲透流水线CPU设计中的各种冒险处理机制和基本的指令级并行处理的内容。
学生在完成了程序设计、数据结构、计算机组成和操作系统等课程学习的基础上,可以进一步学习编译器的设计原理和实现技术。因而,在三年级下学期我们开设了编译原理课程。该课程的各个知识模块综合起来对应的培养目标,是使每位学生掌握和编译器设计相关的形式语言理论基础,了解编译器生成工具的使用方式以及实践一个简单编译器的设计与实现过程。该课程实验包含了词法和语法分析、语义分析、中间代码生成和目标代码生成等四个阶段,要求能够将类C语言源程序转换成对应的MIPS 32汇编目标代码,并能在SPIM模拟器上通过测试程序的验证。
第三层系统综合课程的教学实施
上述两层课程主要围绕单机计算机系统在基础框架和具体实现细节两个层面上开展教学。然而,现实中使用的计算平台是多样化的,例如,云计算平台、大型数据中心和移动终端设备等。为了使学生了解新型计算系统的基本原理和应用开发技术,还需要针对不同计算平台开设相应的课程。第三层系统综合课程主要介绍不同计算平台的系统基本原理及应用开发技术。这类课程主要包括计算机系统综合实验、嵌入式系统、并行处理技术和大数据处理综合实验等。
计算机系统综合实验课程要求计算机软件和硬件相结合,强调计算机系统各层之间的衔接与联系。实验要求学生将前导课实验中所做的CPU、操作系统、编译器等综合起来,完成一个完整系统设计综合实验。实验强调学生的动手能力和对系统的设计能力,培养能够独立开发一套简单系统,并能对整个系统进行改进和优化的能力。
嵌入式系统主要介绍嵌入式系统概论、嵌入式处理器、存储器及其总线互连,嵌入式系统集成接口,嵌入式操作系统,嵌入式硬件与软件协同设计方法与工具,嵌入式应用系统开发及其工具,嵌入式系统功耗分析与优化设计等。
并行处理技术课程主要介绍并行计算模型、并行算法设计以及编程实现与性能评价。通过介绍任务分解、任务调度、负载平衡、设计模式和设计技巧等知识,掌握并行算法设计的基本原理、基本方法与基本技术;通过对MPI与OpenMP等编程语言或编程模型的简单介绍,使学生掌握并行算法程序实现的基本知识;通过几类典型的数值与非数值并行算法的介绍,加深学生对并行算法设计基本原理与常用方法的理解,并为实际应用问题的并行算法设计与并行处理打下坚实的基础。
大数据处理综合实验课程,通过介绍基于集群的大规模海量数据并行处理技术和MapReduce并行编程模型和方法,使学生能够理解和掌握并行处理技术的基本概念、原理和构架,以及基于集群的大规模海量数据的并行处理与编程技术方法,并能够用MapReduce实际设计和编写具体的大数据处理应用问题的算法。
课程体系实施过程中实验链的构建
在上述课程体系的具体实施过程中,我们根据认知规律和计算机层次结构的特点, 按照“从程序设计基础到系统基础,从功能部件到CPU模块,从系统基础到操作系统,从体系结构到编译器,从系统各核心模块到完整系统”的实验设计指导方针,对各课程教学和实验内容统一规划,使各层次教学环环相扣,科学、系统地重构了相关课程之间前后贯通的实验链,体现了多层次螺旋式递进的培养过程。例如,为使学生顺利完成计算机系统基础课程中x86模拟器设计实验,新增一门程序设计基础实验课;为使学生能顺利完成复杂CPU设计实验,将数字电路与计算机组成原理和系统结构实验统一协调;为使学生能顺利完成高强度的操作系统实验,将计算机系统基础和操作系统实验统一规划;编译原理实验利用前导课讲解的MIPS指令集,设计了从中间代码向MIPS目标代码转换并优化的实验;计算机系统设计综合实验课程把前导课实验中所做的CPU、操作系统、编译器等综合起来,完成一个完整的系统设计综合实验;在前述单计算机系统实验基础上,通过大数据处理综合实验课程,将系统能力培养上升到分布式并行计算系统的应用层次。通过强化每门课程的实验内容,大大提升了系统能力培养的实际效果。
结语
南京大学计算机科学与技术系从2013级开始,实施本文所述的计算机系统能力培养课程体系教学,施教的第一届目前是本科四年级,随后的三年级和二年级学生开展了其中部分课程的教学。从2013级以后的培养效果来看,学生在系统分析、设计、检错和调优等各方面的能力都有所提高。首先,编写和调试大规模复杂程序的能力得到了提高,开发几千到上万行程序不再害怕,特别是学会了使用各种不同层面的调试手段和调试工具进行程序调试;其次,能够进行软、硬件协同设计和开发,会使用模拟器软件进行性能评测和硬件设计,并能够通过硬件描述语言和FPGA套件进行复杂硬件的设计;最后,并行程序设计能力也得到很大提高,深刻理解了指令级并行、数据级并行、线程级并行和应用级并行的基本概念,并能够在相关硬件或软件开发中实现相应的并行机制。有些学生在本科阶段就参加了中科院计算所的相关研究课题,这些学生在课题组的工作中表现出较好的系统思维和系统设计及开发能力。目前,系统能力培养方面的教学工作只是处于探索阶段,还有很多问题需要思考和解决,我们将不断进行新的探索,期待取得更好的教学成果。
所有评论仅代表网友意见